package common.utils;

import common.exception.BusinessException;
import common.model.result.ResultCodeEnum;

import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.function.Supplier;

/**
 * 参数验证工具类
 * 用于方法开始处进行参数校验，预防空指针异常
 */
public class ParamValidator {

    /**
     * 验证对象不为null
     * @param obj 待验证对象
     * @param message 错误消息
     * @throws BusinessException 当obj为null时抛出异常
     */
    public static void notNull(Object obj, String message) {
        if (obj == null) {
            throw new BusinessException(ResultCodeEnum.BAD_REQUEST, message);
        }
    }
    
    /**
     * 验证对象不为null，返回原对象
     * @param obj 待验证对象
     * @param message 错误消息
     * @return 验证通过的对象
     * @throws BusinessException 当obj为null时抛出异常
     */
    public static <T> T checkNotNull(T obj, String message) {
        notNull(obj, message);
        return obj;
    }
    
    /**
     * 验证字符串不为空（null或空字符串）
     * @param str 待验证字符串
     * @param message 错误消息
     * @throws BusinessException 当str为null或空时抛出异常
     */
    public static void notEmpty(String str, String message) {
        if (str == null || str.trim().isEmpty()) {
            throw new BusinessException(ResultCodeEnum.BAD_REQUEST, message);
        }
    }
    
    /**
     * 验证集合不为空（null或空集合）
     * @param collection 待验证集合
     * @param message 错误消息
     * @throws BusinessException 当collection为null或空时抛出异常
     */
    public static void notEmpty(Collection<?> collection, String message) {
        if (collection == null || collection.isEmpty()) {
            throw new BusinessException(ResultCodeEnum.BAD_REQUEST, message);
        }
    }
    
    /**
     * 验证Map不为空（null或空Map）
     * @param map 待验证Map
     * @param message 错误消息
     * @throws BusinessException 当map为null或空时抛出异常
     */
    public static void notEmpty(Map<?, ?> map, String message) {
        if (map == null || map.isEmpty()) {
            throw new BusinessException(ResultCodeEnum.BAD_REQUEST, message);
        }
    }
    
    /**
     * 验证数组不为空（null或空数组）
     * @param array 待验证数组
     * @param message 错误消息
     * @throws BusinessException 当array为null或空时抛出异常
     */
    public static void notEmpty(Object[] array, String message) {
        if (array == null || array.length == 0) {
            throw new BusinessException(ResultCodeEnum.BAD_REQUEST, message);
        }
    }
    
    /**
     * 验证表达式为true
     * @param expression 待验证表达式
     * @param message 错误消息
     * @throws BusinessException 当expression为false时抛出异常
     */
    public static void isTrue(boolean expression, String message) {
        if (!expression) {
            throw new BusinessException(ResultCodeEnum.BAD_REQUEST, message);
        }
    }
    
    /**
     * 验证对象等于指定值
     * @param obj 待验证对象
     * @param value 目标值
     * @param message 错误消息
     * @throws BusinessException 当obj不等于value时抛出异常
     */
    public static void equals(Object obj, Object value, String message) {
        if (!Objects.equals(obj, value)) {
            throw new BusinessException(ResultCodeEnum.BAD_REQUEST, message);
        }
    }
    
    /**
     * 验证数值在指定范围内
     * @param value 待验证数值
     * @param min 最小值（包含）
     * @param max 最大值（包含）
     * @param message 错误消息
     * @throws BusinessException 当value不在[min,max]范围内时抛出异常
     */
    public static void between(int value, int min, int max, String message) {
        if (value < min || value > max) {
            throw new BusinessException(ResultCodeEnum.BAD_REQUEST, message);
        }
    }
    
    /**
     * 验证数值在指定范围内
     * @param value 待验证数值
     * @param min 最小值（包含）
     * @param max 最大值（包含）
     * @param message 错误消息
     * @throws BusinessException 当value不在[min,max]范围内时抛出异常
     */
    public static void between(long value, long min, long max, String message) {
        if (value < min || value > max) {
            throw new BusinessException(ResultCodeEnum.BAD_REQUEST, message);
        }
    }
    
    /**
     * 验证数值在指定范围内
     * @param value 待验证数值
     * @param min 最小值（包含）
     * @param max 最大值（包含）
     * @param message 错误消息
     * @throws BusinessException 当value不在[min,max]范围内时抛出异常
     */
    public static void between(double value, double min, double max, String message) {
        if (value < min || value > max) {
            throw new BusinessException(ResultCodeEnum.BAD_REQUEST, message);
        }
    }
    
    /**
     * 获取对象值，为null时返回默认值
     * @param obj 对象
     * @param defaultValue 默认值
     * @return 对象不为null时返回对象本身，否则返回默认值
     */
    public static <T> T defaultIfNull(T obj, T defaultValue) {
        return obj != null ? obj : defaultValue;
    }
    
    /**
     * 获取对象值，为null时通过提供者获取默认值
     * @param obj 对象
     * @param defaultValueSupplier 默认值提供者
     * @return 对象不为null时返回对象本身，否则返回提供者提供的默认值
     */
    public static <T> T defaultIfNull(T obj, Supplier<T> defaultValueSupplier) {
        return obj != null ? obj : defaultValueSupplier.get();
    }
} 